iT邦幫忙

2026 iThome 鐵人賽

DAY 8
0

加入道具要有哪一些功能?

道具第一個功能是玩家碰到(穿過)時,會消滅道具物件。
第二個功能是玩家碰到(穿過)時,就要獲得道具的該效果。
今天就從生成道具開始吧,原先想說請AI協助我畫圖,但Gemini生圖有一點爛,就繼續做程式。

先讓道具可以被取得

首先製作一個簡單的道具腳本,讓小鳥碰到羽毛時,可以判定玩家取得了道具,並將羽毛從場景中移除。
目前先用 Debug.Log 顯示取得的道具名稱,之後如果要加入收集數量,就可以再從這裡繼續修改。

using UnityEngine;

public class ItemCollectible : MonoBehaviour
{
    [Header("道具屬性")]
    [Tooltip("道具種類名稱(預設為 Feather)")]
    public string itemName = "Feather";

    private void OnTriggerEnter2D(Collider2D other)
    {
        // 只要碰撞對象是小鳥(Tag 為 Player)
        if (other.CompareTag("Player"))
        {
            Debug.Log($"【吃到道具】獲得了:{itemName}");
            
            // 吃到羽毛後自我銷毀
            Destroy(gameObject);
        }
    }
}

再讓道具隨機生成

有了可以取得的道具後,接下來就是讓它自己出現在遊戲場景中。
這次不希望羽毛固定在同一個時間出現,因此讓生成時間在 5~15 秒之間隨機選擇。
生成位置也不固定在同一個高度,而是在一定範圍內隨機調整,讓每次遊玩時道具出現的位置不完全一樣。
另外,道具的移動速度會直接取得目前 RockSpawner 的速度,因此當遊戲難度提升時,道具也會跟著場景一起加快。

using UnityEngine;

public class ItemSpawner : MonoBehaviour
{
    [Header("道具清單")]
    [Tooltip("可以產生的羽毛道具 Prefab 陣列")]
    public GameObject[] itemPrefabs;

    [Header("生成時間範圍(秒)")]
    public float minSpawnInterval = 5f;
    public float maxSpawnInterval = 15f;

    [Header("生成高度設定")]
    [Tooltip("當產生上岩石時,羽毛出現的安全 Y 軸高度(中下方)")]
    public float spawnYForTopRock = -1.5f;

    [Tooltip("當產生下岩石時,羽毛出現的安全 Y 軸高度(中上方)")]
    public float spawnYForBottomRock = 1.5f;

    [Tooltip("Y 軸隨機微調幅度")]
    public float yOffset = 0.5f;

    [Header("關聯的 RockSpawner")]
    public RockSpawner rockSpawner;

    private float timer = 0f;
    private float nextSpawnTime = 0f;

    void Start()
    {
        if (rockSpawner == null)
        {
            rockSpawner = FindObjectOfType<RockSpawner>();
        }

        ResetTimer();
    }

    void Update()
    {
        timer += Time.deltaTime;

        if (timer >= nextSpawnTime)
        {
            SpawnRandomItem();
            ResetTimer();
        }
    }

    void ResetTimer()
    {
        timer = 0f;
        // 5 ~ 15 秒間隨機抽一個時間點生成羽毛
        nextSpawnTime = Random.Range(minSpawnInterval, maxSpawnInterval);
    }

    void SpawnRandomItem()
    {
        if (itemPrefabs == null || itemPrefabs.Length == 0) return;

        int randomIndex = Random.Range(0, itemPrefabs.Length);
        GameObject selectedItem = itemPrefabs[randomIndex];

        float targetY = Random.Range(-1.5f, 1.5f);
        targetY += Random.Range(-yOffset, yOffset);

        Vector3 spawnPosition = new Vector3(transform.position.x, targetY, 0f);

        GameObject newNextItem = Instantiate(selectedItem, spawnPosition, Quaternion.identity);

        PipeMove itemMove = newNextItem.GetComponent<PipeMove>();
        if (itemMove != null && rockSpawner != null)
        {
            itemMove.moveSpeed = rockSpawner.currentSpeed;
        }
    }
}

目前道具的功能還很簡單,主要就是「生成 → 移動 → 小鳥碰到 → 消失」,先把最基本的流程建立起來。

接下來的製作方向

明天大概會先產出遊戲相關物件,順便思考還能新增哪一些功能道具。
原本有考慮請Gemini協助生成遊戲素材,但今天暫時先把程式部分處理完,圖片素材的部分等有比較完整的時間再來嘗試,但生成圖片應該不是這AI擅長的部份,所以可能會自己產出圖片。

第八天的成果

目前已經可以讓羽毛隨機出現在場景中,小鳥碰到後也會判定取得並將道具移除。
這次也是先把自己想做的功能告訴 Gemini,再讓它協助產生程式碼,最後放進 Unity 中測試。
接下來會繼續從目前的基礎慢慢增加功能,也會依照實際製作的難度調整原本的構想。


上一篇
Day 7|更換障礙物,改變玩法
下一篇
Day 9|讓道具生成位置避開障礙物
系列文
從基礎到實作:使用 Google AI 學習程式設計9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言